typeof null 為 object 是當初設計上的錯誤,因此將錯就錯沿用至今。
var empty; // 先設定一個變數,但不賦予值
console.log(empty); // undefined
empty = null; // 賦予一個 null 值
console.log(empty); // null
console.log(typeof empty); // object
接下來讓我們來比較一下 undefined 和 null
console.log( undefined == null ); // true
console.log( undefined === null ); // false
是不是覺得很疑惑,為什麼第一個結果會是 True ,但第二個結果會是 False ?
因為 Null 與 Undefined 皆為 Falsy 值,所以回傳 True,且依據 ECMAScript 的標準,當 == 兩邊為 undefined 與 null 即回傳 true。
這邊因為用三個等號,所以會去比較他們的型別,所以為 false,且依據 ECMAScript 的標準,當 === 左右兩邊分別為 undefined 與 null 即回傳 null。
在JS中有許多數值放在邏輯判斷中其結果等價於 true 。但其數值並非 true,因此,我們叫這類數值為 truthy ,而 falsy 也是同理。
那我們該如何判斷呢?
if ( 想要檢測的值 ) {
// 此值為 truthy
} else {
// 此值為 falsy
}
當然我們可以再把檢測的方式再簡化
console.log(Boolean("")); // false 意味者空字串等價於 falsy
console.log(!!""); // false 兩個驚嘆號 等同於 Boolean()
有時候有些朋友會把一個驚嘆號或兩個驚嘆號搞混,在這邊稍為提醒一下,一個驚嘆號是把值反轉,例如 !true 就是 false,反之亦然。
參考資料: Tommy - 深入 JavaScript 核心課程
ECMAScript
JS Comparison Table